Robust forecasts ================= The economy's long-run mean has moved — an inflation regime, a productivity slowdown, a new normal for interest rates — and the model does not know it. A DSGE model, like almost every econometric model, forecasts by *equilibrium correction*: at first order, its forecast from today's state is .. code-block:: none ybar + S^h * (y(T) - ybar) where ``ybar`` is the steady state and ``S`` the transition matrix. When the mean has shifted, the forecast keeps returning to the old ``ybar``. The error this causes does not fade with the horizon; it **grows towards the size of the shift**. A better-specified model does not cure that, because the problem is not the dynamics — it is where they are heading. ``rise.scenario.relocate`` keeps the model's dynamics and replaces only the mean they return to: .. code-block:: none mu + S^h * (y(T) - mu) with ``mu`` a local, robust estimate of where the economy now is. .. code-block:: matlab out = rise.scenario.relocate(m, history, Method="srw", Window=4, Horizon=12); .. contents:: :local: :depth: 2 The devices ------------ .. code-block:: none model ybar the model as specified rw y(T) the random walk srw mean of the last Window obs. the smooth random walk rp y(T) + S*inv(I-S)*dy(T) the robust predictor srp mean of rp over the Window the smooth robust predictor intercept model forecast + last one-step error, at every horizon ``history`` holds every endogenous variable, most recent observation last. With real data those are the smoothed states, not only the observables — the model's dynamics act on all of them. The robust predictor is written for a single equation as ``x(T) + rho/(1-rho)*dx(T)``. ``S*inv(I-S)`` is its form for a system; on a one-equation model it is exactly the scalar formula. What it buys, and what it costs -------------------------------- A small New Keynesian model, inflation forecasts, 300 simulated histories, forecast origins 4 to 24 quarters after the shift. RMSE relative to the model, averaged over horizons 1 to 12: .. code-block:: none level shift slope break no break srw 0.80 0.75 1.19 rw 0.84 0.76 1.24 intercept 0.80 0.75 1.20 srp 1.02 0.91 1.49 rp 1.66 1.44 2.39 Below 1 beats the model. Three readings: * **After a shift, the cheap devices beat the model**: the smooth random walk and intercept correction cut the error by about a fifth. * **Smoothing earns its keep**: ``srw`` beats ``rw``, ``srp`` beats ``rp``. A local estimate from one observation is too noisy; averaging a few trades a little bias for much less variance. * **The insurance has a premium.** In the "no break" column there is nothing to correct. The random walks and intercept correction then cost about a fifth more error than simply trusting the model; the smooth robust predictor about half again, and the plain one more than double. Use them when you have reason to believe the mean has moved, not as a default. Which device for which break ----------------------------- The robust predictor extrapolates the latest *change*. When the mean has shifted once and settled, that change is mostly noise, and the gain ``S*inv(I-S)`` — four, at persistence 0.8 — amplifies it. When the mean is *trending*, the change carries signal. So the predictor should improve as the trend steepens. It does: .. code-block:: none slope of the new mean relative RMSE at h1 at h12 (sd per quarter) srw srp rp srw srp rp 0.00 1.04 1.11 1.41 1.33 1.74 3.01 0.06 0.56 0.60 0.74 0.82 1.00 1.61 0.15 0.29 0.31 0.34 0.59 0.64 0.84 0.30 0.20 0.21 0.18 0.53 0.55 0.58 0.60 0.17 0.17 0.11 0.51 0.52 0.49 The rule of thumb: * a **level shift**, or a gentle drift — ``srw`` or ``intercept``; * a **strong trend break** — ``rp``. What it gives up ----------------- Each variable's mean is relocated on its own. The relocated means are not, in general, a steady state of the model: ratios the model holds fixed need not hold between them. That is the price of forecasting *around* the model rather than with it. If you need the structure to hold, the model itself has to change. Pass ``Variables`` to relocate only some means and keep the model's steady state for the rest. What it refuses ---------------- .. code-block:: none historyTooShort fewer observations than the method needs historyMissingVariables a variable absent from the history historyNotFinite a gap in the history historyRagged variables of different lengths unknownVariable a name in Variables the model does not have unitRootInDynamics rp or srp on dynamics with a root at one notSolved no first-order solution switchingNotSupported a regime-switching model All carry the prefix ``RISE:scenario:``. On a unit root the random walks still work; only the predictors, which divide by ``I - S``, are refused. References ----------- * Martinez, Castle and Hendry (2026), "Smooth robust multi-horizon forecasts", presented at *Model Invariance and Constancy in the Face of Large Shocks*, Oslo. * Hendry, Castle and Doornik (2026), "A forecast-error taxonomy facing multiple shifts", same conference. * Castle, Clements and Hendry (2015), "Robust approaches to forecasting", *International Journal of Forecasting* 31(1), 99–112. * Hendry (2006), "Robustifying forecasts from equilibrium-correction systems", *Journal of Econometrics* 135(1–2), 399–426. * Clements and Hendry (1998), *Forecasting Economic Time Series*, Cambridge University Press. See also --------- * :doc:`Entropic tilting` — the first rung: reweight the forecast density without touching the model * :doc:`Scenario plausibility` — the second: force a path, and price it